﻿using System;
using System.Collections;
using System.ComponentModel;
using System.Collections.Generic;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.UI.Exceptions;
using Sinacor.UI.Bovespa.Clientes.Model;
using Sinacor.UI.Bovespa.Clientes.Communication;
using Sinacor.UI.Bovespa.Clientes.Communication.Bovespa.Cliente.Cliente;
using Sinacor.UI.Bovespa.Clientes.Communication.Bovespa.Custodia.Custodia;
using Sinacor.UI.Bovespa.Clientes.Communication.Bovespa.ContasCorrente.ContasCorrente;
using ContaCorrenteResponse = Sinacor.UI.Bovespa.Clientes.Communication.Bovespa.ContasCorrente.ContasCorrente.ContaCorrenteResponse;

namespace Sinacor.UI.Bovespa.Clientes.Presenter
{
    public class InformacoesClientesPresenter : BasePresenter<IInformacoesClientes>
    {
        private IInformacoesClientes _view;
        private Cliente _comunicacaoCliente;
        private Communication.Custodia _comunicacaoCustodia;
        private ContasCorrente _comunicacaoCtaCorrente;

        public InformacoesClientesPresenter(IInformacoesClientes view)
            : base(view)
        {
            this._view = view;
        }

        #region CarregarCliente
        public void CarregarCliente(InformacoesCliente model)
        {
            ClienteResponse cliente = null;
            InformacoesCliente modelCliente = null;
            List<EmissorOrdemResponse> emissor = null;
            Sinacor.UI.Bovespa.Clientes.Communication.Bovespa.Custodia.Custodia.PosicaoCustodiaResponse custodia = null;

            //Ptruiz.gp - 2008.12.19 - Alteração para retornar Model de acordo com o Padrão (Bug de ordenação de Grid)
            //Sinacor.UI.Bovespa.Clientes.Communication.Bovespa.ContasCorrente.ContasCorrente.PosicaoContasCorrenteResponse ctaCorrente = null;
            Model.PosicaoContasCorrente ctaCorrente = null;

            //BindingList<ContaCorrenteResponse> tabelCtaCorrente = null;
            ModelCollection<Model.ContaCorrente> tabelCtaCorrente = null;

            ConsultarInformacaoClienteRequest filtroCliente = null;
            ConsultarPosicaoCustodiaRequest filtroCustodia = null;
            ConsultarPosicaoContaCorrenteRequest filtroCtaCorrente = null;
            ConsultarEmissorOrdemRequest filtroEmissor = null;

            try
            {
                this._comunicacaoCliente = new Cliente(this.Session);

                //20080423 13:38 - Adicionado para atender ao chamado 3553 - DMilanez.7Comm
                if (!model.Codigo.HasValue && String.IsNullOrEmpty(model.Apelido))
                {
                    this._view.InformarFiltroNaoPreenchido();
                    return;
                }

                filtroCliente = new ConsultarInformacaoClienteRequest();
                filtroCliente.CodigoCliente = model.Codigo;
                filtroCliente.Apelido = model.Apelido;

                filtroEmissor = new ConsultarEmissorOrdemRequest();
                filtroEmissor.CodigoCliente = model.Codigo;
                filtroEmissor.Apelido = model.Apelido;

                cliente = this._comunicacaoCliente.ConsultarInformacoesCliente(filtroCliente);
                emissor = this._comunicacaoCliente.ConsultarEmissorOrdem(filtroEmissor);

                if (cliente == null)
                    this._view.ExibirMensagem(Sinacor.UI.Bovespa.Clientes.Model.Enum.Mensagem.ClienteInesistente);
                else
                {
                    modelCliente = new InformacoesCliente();

                    //20080423 11:40 - Adicionado para atender ao chamado 3364 - DMilanez.7Comm
                    //{
                    modelCliente.IsBloqueado = cliente.isBloqueado;
                    modelCliente.TipoBloqueio = cliente.TipoBloqueio;
                    modelCliente.DescricaoBloqueio = cliente.DescricaoBloqueio;
                    //}

                    modelCliente.Codigo = cliente.Codigo;
                    modelCliente.CodigoDigito = cliente.DigitoVerificador;
                    modelCliente.Apelido = cliente.Apelido;
                    modelCliente.Nome = cliente.Nome;

                    //20080421 16:50 - Renomeado de ContaInvestimento para ClienteContaInvestimento - DMilanez.7Comm
                    modelCliente.ClienteContaInvestimento = cliente.ClienteContaInvestimento;
                    //20080421 16:56 - Adicionado para atender ao chamado 3063 - DMilanez.7Comm
                    modelCliente.DigitoClienteContaInvestimento = cliente.DigitoClienteContaInvestimento;
                    //20080421 16:56 - Adicionado para atender ao chamado 3063 - DMilanez.7Comm
                    modelCliente.ClienteContaDeposito = cliente.ClienteContaDeposito;
                    //20080421 16:56 - Adicionado para atender ao chamado 3063 - DMilanez.7Comm
                    modelCliente.DigitoClienteContaDeposito = cliente.DigitoClienteContaDeposito;
                    //20080421 16:56 - Adicionado para atender ao chamado 3063 - DMilanez.7Comm
                    modelCliente.IsContaInvestimento = cliente.IsContaInvestimento;

                    modelCliente.Cpfcnpj = cliente.CPFCNPJ;
                    modelCliente.Origem = cliente.Origem;
                    modelCliente.Assessor = cliente.Assessor;

                    modelCliente.BancoDividendo.Agencia = cliente.BancoDividendo.Agencia;
                    modelCliente.BancoDividendo.Banco = cliente.BancoDividendo.Banco;
                    modelCliente.BancoDividendo.CodigoDvAgencia = cliente.BancoDividendo.CodigoDVAgencia;
                    modelCliente.BancoDividendo.CodigoDvConta = cliente.BancoDividendo.CodigoDVConta;
                    modelCliente.BancoDividendo.Conta = cliente.BancoDividendo.Conta;

                    modelCliente.BancoContaCorrente.Agencia = cliente.BancoContaCorrente.Agencia;
                    modelCliente.BancoContaCorrente.Banco = cliente.BancoContaCorrente.Banco;
                    modelCliente.BancoContaCorrente.CodigoDvAgencia = cliente.BancoContaCorrente.CodigoDVAgencia;
                    modelCliente.BancoContaCorrente.CodigoDvConta = cliente.BancoContaCorrente.CodigoDVConta;
                    modelCliente.BancoContaCorrente.Conta = cliente.BancoContaCorrente.Conta;

                    foreach (TelefoneResponse item in cliente.Telefone)
                    {
                        InformacoesClienteTelefone newItem = new InformacoesClienteTelefone();

                        newItem.DDD = item.DDD;
                        newItem.Ramal = item.Ramal;
                        newItem.Telefone = item.Numero;
                        newItem.Contato = item.Contato;

                        switch (item.TipoTelefone)
                        {
                            case Sinacor.UI.Bovespa.Clientes.Communication.Bovespa.Cliente.Cliente.TipoTelefone.Fax:
                                newItem.TipoTelefone = Model.Enum.TipoTelefone.Fax;
                                break;

                            case Sinacor.UI.Bovespa.Clientes.Communication.Bovespa.Cliente.Cliente.TipoTelefone.Telefone:
                                newItem.TipoTelefone = Model.Enum.TipoTelefone.Telefone;
                                break;
                        }
                        modelCliente.Telefones.Add(newItem);
                    }

                    foreach (Decimal var in cliente.LimitesOperacionais)
                    {
                        modelCliente.LimiteOperacionais.Add(var);
                    }

                    switch (cliente.TransmissaoOrdem)
                    {
                        case Sinacor.UI.Bovespa.Clientes.Communication.Bovespa.Cliente.Cliente.TipoTransmissaoOrdem.OrdemVerbal:
                            modelCliente.TransmissaoOrdem = Sinacor.UI.Bovespa.Clientes.Model.Enum.TipoTransmissaoOrdem.OrdemVerbal;
                            break;

                        case Sinacor.UI.Bovespa.Clientes.Communication.Bovespa.Cliente.Cliente.TipoTransmissaoOrdem.OrdemEscritaPorEmail:
                            modelCliente.TransmissaoOrdem = Sinacor.UI.Bovespa.Clientes.Model.Enum.TipoTransmissaoOrdem.OrdemEscritaPorEmail;
                            break;

                        case Sinacor.UI.Bovespa.Clientes.Communication.Bovespa.Cliente.Cliente.TipoTransmissaoOrdem.OrdemEscritaPorFax:
                            modelCliente.TransmissaoOrdem = Sinacor.UI.Bovespa.Clientes.Model.Enum.TipoTransmissaoOrdem.OrdemEscritaPorFax;
                            break;

                        case Sinacor.UI.Bovespa.Clientes.Communication.Bovespa.Cliente.Cliente.TipoTransmissaoOrdem.OrdemEscritaPorCarta:
                            modelCliente.TransmissaoOrdem = Sinacor.UI.Bovespa.Clientes.Model.Enum.TipoTransmissaoOrdem.OrdemEscritaPorCarta;
                            break;
                    }

                    foreach (EnderecoResponse item in cliente.Endereco)
                    {
                        InformacoesClienteEndereco newItem = new InformacoesClienteEndereco();

                        newItem.Bairro = item.Bairro;
                        newItem.Cep = item.CEP;
                        newItem.Cidade = item.Cidade;
                        newItem.Complemento = item.Complemento;
                        newItem.Email = item.Email;
                        newItem.Numero = item.Numero;
                        newItem.Rua = item.Rua;
                        newItem.Uf = item.UF;

                        switch (item.Tipo)
                        {
                            case Sinacor.UI.Bovespa.Clientes.Communication.Bovespa.Cliente.Cliente.TipoEndereco.Comercial:
                                newItem.TipoEndereco = Model.Enum.TipoEndereco.Comercial;
                                break;

                            case Sinacor.UI.Bovespa.Clientes.Communication.Bovespa.Cliente.Cliente.TipoEndereco.Residencial:
                                newItem.TipoEndereco = Model.Enum.TipoEndereco.Residencial;
                                break;
                        }
                        modelCliente.Enderecos.Add(newItem);
                    }
                }
                //Ptruiz.gp - 2008.12.18 -  Alterado para atender Bug Solicitação MMacarini
                if (emissor != null && emissor.Count > 0)
                    this._view.ExibirEmissorOrdem(emissor);
                else
                    this._view.ExibirEmissorOrdem();
            }
            catch (Exception ex)
            {
                //if (((Sinacor.Infra.UI.Exceptions.BusinessException)(ex)).ErrorNumber == 105000)
                //    throw new Exception("Bovespa.Clientes.Message.ClienteInexistente");
                //else
                HandleException(ex);
                return;
            }
            try
            {
                this._comunicacaoCustodia = new Communication.Custodia(this.Session);

                //20080422 15:33 - Alterado de forma a preencher o filtro antes de chamar ao consulta - DMilanez.7Comm
                filtroCustodia = new ConsultarPosicaoCustodiaRequest();
                filtroCustodia.CodigoCliente = model.Codigo;
                filtroCustodia.Apelido = model.Apelido;

                custodia = _comunicacaoCustodia.ConsultarPosicaoCustodia(filtroCustodia);

                List<Sinacor.UI.Bovespa.Clientes.Communication.Bovespa.Custodia.Custodia.CustodiaResponse> listCustodia = null;
                List<Sinacor.UI.Bovespa.Clientes.Communication.Bovespa.Custodia.Custodia.CustodiaResponse> listCtaInvestimento = null;

                if (custodia != null)
                {
                    listCustodia = new List<Sinacor.UI.Bovespa.Clientes.Communication.Bovespa.Custodia.Custodia.CustodiaResponse>();
                    listCtaInvestimento = new List<Sinacor.UI.Bovespa.Clientes.Communication.Bovespa.Custodia.Custodia.CustodiaResponse>();

                    modelCliente.PosicaoContaInvestimentoEm = custodia.DataPosicao;
                    modelCliente.PosicaoCustodiaEm = custodia.DataPosicao;

                    foreach (Sinacor.UI.Bovespa.Clientes.Communication.Bovespa.Custodia.Custodia.CustodiaResponse item in custodia.Custodia)
                    {
                        if (item.isContaInvestimento == true)
                            listCtaInvestimento.Add(item);
                        else
                            listCustodia.Add(item);
                    }
                }

                this._view.ExibirContaInvestimento(listCtaInvestimento);
                this._view.ExibirCustodia(listCustodia);
            }

            catch (Exception ex)
            {
                HandleException(ex);
            }

            try
            {
                this._comunicacaoCtaCorrente = new ContasCorrente(this.Session);

                filtroCtaCorrente = new ConsultarPosicaoContaCorrenteRequest();
                filtroCtaCorrente.CodigoCliente = model.Codigo;
                filtroCtaCorrente.Apelido = model.Apelido;

                ctaCorrente = _comunicacaoCtaCorrente.ConsultarPosicaoContasCorrente(filtroCtaCorrente);

                if (ctaCorrente != null)
                {
                    tabelCtaCorrente = ctaCorrente.ContasCorrente;
                    modelCliente.PosicaoContaCorrenteEm = ctaCorrente.DataPosicao;
                }

                this._view.ExibirContaCorrente(tabelCtaCorrente);
                this._view.ExibirDados(modelCliente);
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }
        #endregion

        #region Métodos
        public void InformarStatusContaCorrente(Model.ContaCorrente contaCorrente)
        {

            if (contaCorrente.isContaInvestimento == true)
            {
                this._view.SinalizarContaInvestimento();
            }
        }

        #endregion

    }
}